import os
import argparse
import sys
from pdf2image import convert_from_path
from PyPDF2 import PdfReader


def pdf_to_jpg(pdf_path, output_folder=None, dpi=300, fmt='jpg', quality=95):
    """
    将PDF文件的每一页转换为JPG图片
    
    参数:
    pdf_path (str): PDF文件路径
    output_folder (str, optional): 输出图片的保存目录，默认为PDF文件所在目录
    dpi (int, optional): 输出图片的DPI，默认为300（DPI越高，图片越清晰，文件也越大）
    fmt (str, optional): 输出图片格式，默认为'jpg'
    quality (int, optional): JPG图片质量(1-95)，默认为95（值越高，质量越好）
    
    返回:
    list: 生成的图片文件路径列表
    """
    # 检查PDF文件是否存在
    if not os.path.exists(pdf_path):
        raise FileNotFoundError(f"PDF文件不存在: {pdf_path}")
    
    # 检查文件是否为PDF格式
    file_ext = os.path.splitext(pdf_path)[1].lower()
    if file_ext != '.pdf':
        raise ValueError(f"文件不是PDF格式: {pdf_path}")
    
    # 获取PDF文件名（不含扩展名）
    pdf_filename = os.path.splitext(os.path.basename(pdf_path))[0]
    
    # 设置输出文件夹
    if output_folder is None:
        output_folder = os.path.dirname(pdf_path) or '.'
    
    # 如果输出文件夹不存在，创建它
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
        print(f"创建输出文件夹: {output_folder}")
    
    try:
        # 获取PDF页数
        with open(pdf_path, 'rb') as file:
            pdf_reader = PdfReader(file)
            num_pages = len(pdf_reader.pages)
        
        print(f"开始转换 {pdf_filename}.pdf 到 {fmt.upper()} 格式...")
        print(f"PDF总页数: {num_pages}")
        print(f"转换参数 - DPI: {dpi}, 质量: {quality}")
        
        # 转换PDF到图像
        print("正在转换PDF页面，请稍候...")
        images = convert_from_path(
            pdf_path,
            dpi=dpi,
            fmt=fmt,
            output_folder=None,
            thread_count=os.cpu_count(),  # 使用多核加速
            use_cropbox=True,
            strict=True
        )
        
        # 保存图像
        output_files = []
        for i, image in enumerate(images):
            # 构建输出文件名，格式为：原文件名_页码.扩展名
            output_filename = f"{pdf_filename}_page_{i+1}.{fmt}"
            output_path = os.path.join(output_folder, output_filename)
            
            # 保存图像
            # 使用'JPEG'作为标准格式而不是'JPG'
            image.save(output_path, format='JPEG', quality=quality)
            output_files.append(output_path)
            
            # 打印进度
            print(f"已保存第 {i+1}/{num_pages} 页到 {output_filename}")
        
        print(f"转换完成！共生成 {len(output_files)} 个{fmt.upper()}文件")
        print(f"所有文件已保存至: {output_folder}")
        return output_files
    except Exception as e:
        # 更详细的错误处理
        if "poppler" in str(e).lower():
            print("\n错误: 找不到poppler库。pdf2image需要poppler来处理PDF文件。")
            print("请按照以下步骤安装poppler:")
            print("1. Windows用户: 下载poppler二进制文件，解压并将bin目录添加到系统PATH")
            print("2. macOS用户: 使用Homebrew安装: brew install poppler")
            print("3. Linux用户: 使用包管理器安装: sudo apt-get install poppler-utils")
            raise RuntimeError(f"缺少必要的依赖: {e}")
        else:
            raise


def main():
    """命令行入口函数"""
    parser = argparse.ArgumentParser(
        description='将PDF文件每页转换为JPG图片',
        formatter_class=argparse.RawTextHelpFormatter,
        epilog="""示例用法:
  python pdf_to_jpg_converter.py document.pdf
  python pdf_to_jpg_converter.py document.pdf -o output_folder
  python pdf_to_jpg_converter.py document.pdf -d 200 -q 80
  python pdf_to_jpg_converter.py "C:\路径\包含空格的文件.pdf" -o "D:\输出目录"
"""
    )
    parser.add_argument('pdf_file', help='PDF文件路径')
    parser.add_argument('-o', '--output', help='输出图片保存目录')
    parser.add_argument('-d', '--dpi', type=int, default=300, help='输出图片DPI (默认: 300)')
    parser.add_argument('-f', '--format', default='jpg', choices=['jpg', 'jpeg'], help='输出图片格式 (默认: jpg)')
    parser.add_argument('-q', '--quality', type=int, default=95, help='JPG图片质量(1-95) (默认: 95)')
    
    args = parser.parse_args()
    
    try:
        pdf_to_jpg(
            pdf_path=args.pdf_file,
            output_folder=args.output,
            dpi=args.dpi,
            fmt=args.format,
            quality=args.quality
        )
    except Exception as e:
        print(f"\n转换过程中出错: {e}")
        print("\n请确保:")
        print("1. PDF文件存在且路径正确")
        print("2. 已安装所有必要的依赖: pip install -r requirements.txt")
        print("3. 已安装poppler并添加到系统PATH")
        sys.exit(1)


if __name__ == "__main__":
    main()